home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / workbench / term_4.8 / extras / source / term-source.lha / Choose.c < prev    next >
C/C++ Source or Header  |  1997-03-11  |  12KB  |  523 lines

  1. /*
  2. **    Choose.c
  3. **
  4. **    Routines that call the application support library (ASL).
  5. **
  6. **    Copyright © 1990-1997 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #ifndef _GLOBAL_H
  11. #include "Global.h"
  12. #endif
  13.  
  14. STATIC LONG
  15. GetDirEntryType(STRPTR Name)
  16. {
  17.     APTR OldWindowPtr;
  18.     LONG Result = 0;
  19.     BPTR FileLock;
  20.  
  21.     DisableDOSRequesters(&OldWindowPtr);
  22.  
  23.     if(FileLock = Lock(Name,SHARED_LOCK))
  24.     {
  25.         D_S(struct FileInfoBlock,FileInfo);
  26.  
  27.         if(Examine(FileLock,FileInfo))
  28.             Result = FileInfo->fib_DirEntryType;
  29.  
  30.         UnLock(FileLock);
  31.     }
  32.  
  33.     EnableDOSRequesters(OldWindowPtr);
  34.  
  35.     return(Result);
  36. }
  37.  
  38. STATIC struct FileRequester *
  39. SelectDrawerCommon(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR DrawerName,LONG DrawerNameSize,BOOL SaveMode)
  40. {
  41.     struct FileRequester *DrawerRequester;
  42.     struct TagItem LocalTags[4+1+1],*TagPtr;
  43.     UBYTE LocalDrawerName[MAX_FILENAME_LENGTH];
  44.  
  45.     if(DrawerName[0])
  46.         LimitedStrcpy(sizeof(LocalDrawerName),LocalDrawerName,DrawerName);
  47.     else
  48.     {
  49.         if(!LocalGetCurrentDirName(LocalDrawerName,sizeof(LocalDrawerName)))
  50.             LocalDrawerName[0] = 0;
  51.     }
  52.  
  53.     GetDimensionTags(Parent,LocalTags);
  54.  
  55.     TagPtr = &LocalTags[4];
  56.  
  57.     if(TitleText)
  58.     {
  59.         TagPtr->ti_Tag    = ASLFR_TitleText;
  60.         TagPtr->ti_Data    = (ULONG)TitleText;
  61.  
  62.         TagPtr++;
  63.     }
  64.  
  65.     TagPtr->ti_Tag = TAG_DONE;
  66.  
  67.     if(!PositiveText)
  68.         PositiveText = LocaleString(MSG_GLOBAL_OPEN_TXT);
  69.  
  70.     if(DrawerRequester = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  71.         ASLFR_Window,            Parent,
  72.         ASLFR_InitialDrawer,    LocalDrawerName,
  73.         ASLFR_PositiveText,        PositiveText,
  74.         ASLFR_Flags1,            SaveMode ? (FILF_SAVE | FILF_NEWIDCMP) : FILF_NEWIDCMP,
  75.         ASLFR_Flags2,            FIL1F_NOFILES,
  76.     TAG_MORE,LocalTags))
  77.     {
  78.         BOOL GotIt = FALSE;
  79.  
  80.         LT_LockWindow(Parent);
  81.  
  82.         if(AslRequest(DrawerRequester,NULL))
  83.         {
  84.             PutDimensionTags(NULL,DrawerRequester->fr_LeftEdge,DrawerRequester->fr_TopEdge,DrawerRequester->fr_Width,DrawerRequester->fr_Height);
  85.  
  86.             if(DrawerRequester->fr_Drawer[0])
  87.             {
  88.                 LimitedStrcpy(DrawerNameSize,DrawerName,DrawerRequester->fr_Drawer);
  89.                 GotIt = TRUE;
  90.             }
  91.         }
  92.  
  93.         if(!GotIt)
  94.         {
  95.             FreeAslRequest(DrawerRequester);
  96.             DrawerRequester = NULL;
  97.         }
  98.  
  99.         LT_UnlockWindow(Parent);
  100.     }
  101.  
  102.     return(DrawerRequester);
  103. }
  104.  
  105. STATIC struct FileRequester *
  106. SaveFileCommon(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR Pattern,STRPTR FullName,LONG FullNameSize,BOOL AskOverwrite)
  107. {
  108.     UBYTE LocalDrawerName[MAX_FILENAME_LENGTH];
  109.     struct TagItem LocalTags[4+2+1],*TagPtr;
  110.     struct FileRequester *FileRequester;
  111.     STRPTR DrawerName,FileName;
  112.     UBYTE Separator;
  113.     ULONG Flags;
  114.  
  115.     Flags = FILF_SAVE | FILF_NEWIDCMP;
  116.  
  117.     GetDimensionTags(Parent,LocalTags);
  118.  
  119.     TagPtr = &LocalTags[4];
  120.  
  121.     if(Pattern)
  122.     {
  123.         Flags |= FRF_DOPATTERNS;
  124.  
  125.         TagPtr->ti_Tag    = ASLFR_InitialPattern;
  126.         TagPtr->ti_Data    = (ULONG)Pattern;
  127.  
  128.         TagPtr++;
  129.     }
  130.  
  131.     if(TitleText)
  132.     {
  133.         TagPtr->ti_Tag    = ASLFR_TitleText;
  134.         TagPtr->ti_Data    = (ULONG)TitleText;
  135.  
  136.         TagPtr++;
  137.     }
  138.  
  139.     TagPtr->ti_Tag = TAG_DONE;
  140.  
  141.     if(!PositiveText)
  142.         PositiveText = LocaleString(MSG_GLOBAL_SAVE_TXT);
  143.  
  144.     if(GetDirEntryType(FullName) > 0)
  145.     {
  146.         FileName    = "";
  147.         DrawerName    = FullName;
  148.         Separator    = 0;
  149.     }
  150.     else
  151.     {
  152.         FileName    = FilePart(FullName);
  153.         DrawerName    = PathPart(FullName);
  154.         Separator    = *DrawerName;
  155.         *DrawerName    = 0;
  156.     }
  157.  
  158.     if(FullName[0])
  159.         LimitedStrcpy(sizeof(LocalDrawerName),LocalDrawerName,FullName);
  160.     else
  161.     {
  162.         if(!LocalGetCurrentDirName(LocalDrawerName,sizeof(LocalDrawerName)))
  163.             LocalDrawerName[0] = 0;
  164.     }
  165.  
  166.     if(Separator)
  167.         *DrawerName = Separator;
  168.  
  169.     FileRequester = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  170.         ASLFR_Window,            Parent,
  171.         ASLFR_InitialDrawer,    LocalDrawerName,
  172.         ASLFR_InitialFile,        FileName,
  173.         ASLFR_PositiveText,        PositiveText,
  174.         ASLFR_Flags1,            Flags,
  175.     TAG_MORE,LocalTags);
  176.  
  177.     if(FileRequester)
  178.     {
  179.         BOOL GotIt = FALSE;
  180.  
  181.         LT_LockWindow(Parent);
  182.  
  183.         if(AslRequest(FileRequester,NULL))
  184.         {
  185.             PutDimensionTags(NULL,FileRequester->fr_LeftEdge,FileRequester->fr_TopEdge,FileRequester->fr_Width,FileRequester->fr_Height);
  186.  
  187.             if(FileRequester->fr_File[0] && strlen(FileRequester->fr_Drawer) < FullNameSize)
  188.             {
  189.                 LimitedStrcpy(FullNameSize,FullName,FileRequester->fr_Drawer);
  190.  
  191.                 if(AddPart(FullName,FileRequester->fr_File,FullNameSize))
  192.                     GotIt = TRUE;
  193.             }
  194.         }
  195.  
  196.         if(GotIt && Config->MiscConfig->ProtectiveMode && AskOverwrite)
  197.         {
  198.             BPTR FileLock;
  199.             BOOL DoesExist;
  200.  
  201.             if(FileLock = Lock(FullName,SHARED_LOCK))
  202.             {
  203.                 DoesExist = TRUE;
  204.  
  205.                 UnLock(FileLock);
  206.             }
  207.             else
  208.                 DoesExist = (BOOL)(IoErr() == ERROR_OBJECT_IN_USE);
  209.  
  210.             if(DoesExist)
  211.             {
  212.                 if(!ShowRequest(Parent,LocaleString(MSG_GLOBAL_FILE_ALREADY_EXISTS_OVERWRITE_TXT),LocaleString(MSG_GLOBAL_REPLACE_CANCEL_TXT),FilePart(FullName)))
  213.                     GotIt = FALSE;
  214.             }
  215.         }
  216.  
  217.         if(!GotIt)
  218.         {
  219.             FreeAslRequest(FileRequester);
  220.             FileRequester = NULL;
  221.         }
  222.  
  223.         LT_UnlockWindow(Parent);
  224.     }
  225.  
  226.     return(FileRequester);
  227. }
  228.  
  229. struct FileRequester *
  230. SaveDrawer(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR DrawerName,LONG DrawerNameSize)
  231. {
  232.     return(SelectDrawerCommon(Parent,TitleText,PositiveText,DrawerName,DrawerNameSize,TRUE));
  233. }
  234.  
  235. struct FileRequester *
  236. OpenDrawer(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR DrawerName,LONG DrawerNameSize)
  237. {
  238.     return(SelectDrawerCommon(Parent,TitleText,PositiveText,DrawerName,DrawerNameSize,FALSE));
  239. }
  240.  
  241. struct FileRequester *
  242. SaveFile(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR Pattern,STRPTR FullName,LONG FullNameSize)
  243. {
  244.     return(SaveFileCommon(Parent,TitleText,PositiveText,Pattern,FullName,FullNameSize,TRUE));
  245. }
  246.  
  247. struct FileRequester *
  248. SaveFileOverwrite(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR Pattern,STRPTR FullName,LONG FullNameSize)
  249. {
  250.     return(SaveFileCommon(Parent,TitleText,PositiveText,Pattern,FullName,FullNameSize,FALSE));
  251. }
  252.  
  253. struct FileRequester *
  254. OpenSingleFile(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR Pattern,STRPTR FullName,LONG FullNameSize)
  255. {
  256.     UBYTE LocalDrawerName[MAX_FILENAME_LENGTH];
  257.     struct TagItem LocalTags[4+2+1],*TagPtr;
  258.     struct FileRequester *FileRequester;
  259.     STRPTR DrawerName,FileName;
  260.     UBYTE Separator;
  261.     ULONG Flags;
  262.  
  263.     Flags = FILF_NEWIDCMP;
  264.  
  265.     GetDimensionTags(Parent,LocalTags);
  266.  
  267.     TagPtr = &LocalTags[4];
  268.  
  269.     if(Pattern)
  270.     {
  271.         Flags |= FRF_DOPATTERNS;
  272.  
  273.         TagPtr->ti_Tag    = ASLFR_InitialPattern;
  274.         TagPtr->ti_Data    = (ULONG)Pattern;
  275.  
  276.         TagPtr++;
  277.     }
  278.  
  279.     if(TitleText)
  280.     {
  281.         TagPtr->ti_Tag    = ASLFR_TitleText;
  282.         TagPtr->ti_Data    = (ULONG)TitleText;
  283.  
  284.         TagPtr++;
  285.     }
  286.  
  287.     TagPtr->ti_Tag = TAG_DONE;
  288.  
  289.     if(!PositiveText)
  290.         PositiveText = LocaleString(MSG_GLOBAL_OPEN_TXT);
  291.  
  292.     if(GetDirEntryType(FullName) > 0)
  293.     {
  294.         FileName    = "";
  295.         DrawerName    = FullName;
  296.         Separator    = 0;
  297.     }
  298.     else
  299.     {
  300.         FileName    = FilePart(FullName);
  301.         DrawerName    = PathPart(FullName);
  302.         Separator    = *DrawerName;
  303.         *DrawerName    = 0;
  304.     }
  305.  
  306.     if(FullName[0])
  307.         LimitedStrcpy(sizeof(LocalDrawerName),LocalDrawerName,FullName);
  308.     else
  309.     {
  310.         if(!LocalGetCurrentDirName(LocalDrawerName,sizeof(LocalDrawerName)))
  311.             LocalDrawerName[0] = 0;
  312.     }
  313.  
  314.     if(Separator)
  315.         *DrawerName = Separator;
  316.  
  317.     FileRequester = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  318.         ASLFR_Window,            Parent,
  319.         ASLFR_InitialDrawer,    LocalDrawerName,
  320.         ASLFR_InitialFile,        FileName,
  321.         ASLFR_PositiveText,        PositiveText,
  322.         ASLFR_Flags1,            Flags,
  323.     TAG_MORE,LocalTags);
  324.  
  325.     if(FileRequester)
  326.     {
  327.         BOOL GotIt = FALSE;
  328.  
  329.         LT_LockWindow(Parent);
  330.  
  331.         if(AslRequest(FileRequester,NULL))
  332.         {
  333.             PutDimensionTags(NULL,FileRequester->fr_LeftEdge,FileRequester->fr_TopEdge,FileRequester->fr_Width,FileRequester->fr_Height);
  334.  
  335.             if(FileRequester->fr_File[0] && strlen(FileRequester->fr_Drawer) < FullNameSize)
  336.             {
  337.                 LimitedStrcpy(FullNameSize,FullName,FileRequester->fr_Drawer);
  338.  
  339.                 if(AddPart(FullName,FileRequester->fr_File,FullNameSize))
  340.                     GotIt = TRUE;
  341.             }
  342.         }
  343.  
  344.         if(!GotIt)
  345.         {
  346.             FreeAslRequest(FileRequester);
  347.             FileRequester = NULL;
  348.         }
  349.  
  350.         LT_UnlockWindow(Parent);
  351.     }
  352.  
  353.     return(FileRequester);
  354. }
  355.  
  356. struct FileRequester *
  357. OpenSeveralFiles(struct Window *Parent,STRPTR TitleText,STRPTR PositiveText,STRPTR Pattern,STRPTR FullName,LONG FullNameSize)
  358. {
  359.     UBYTE LocalDrawerName[MAX_FILENAME_LENGTH];
  360.     struct TagItem LocalTags[4+3+1],*TagPtr;
  361.     struct FileRequester *FileRequester;
  362.     STRPTR DrawerName,FileName;
  363.     UBYTE Separator;
  364.     ULONG Flags;
  365.  
  366.     Flags = FILF_MULTISELECT | FILF_NEWIDCMP;
  367.  
  368.     GetDimensionTags(Parent,LocalTags);
  369.  
  370.     TagPtr = &LocalTags[4];
  371.  
  372.     if(Pattern)
  373.     {
  374.         Flags |= FRF_DOPATTERNS;
  375.  
  376.         TagPtr->ti_Tag    = ASLFR_InitialPattern;
  377.         TagPtr->ti_Data    = (ULONG)Pattern;
  378.  
  379.         TagPtr++;
  380.     }
  381.  
  382.     if(TitleText)
  383.     {
  384.         TagPtr->ti_Tag    = ASLFR_TitleText;
  385.         TagPtr->ti_Data    = (ULONG)TitleText;
  386.  
  387.         TagPtr++;
  388.     }
  389.  
  390.     if(PositiveText)
  391.     {
  392.         TagPtr->ti_Tag    = ASLFR_PositiveText;
  393.         TagPtr->ti_Data    = (ULONG)PositiveText;
  394.  
  395.         TagPtr++;
  396.     }
  397.  
  398.     TagPtr->ti_Tag = TAG_DONE;
  399.  
  400.     if(GetDirEntryType(FullName) > 0)
  401.     {
  402.         FileName    = "";
  403.         DrawerName    = FullName;
  404.         Separator    = 0;
  405.     }
  406.     else
  407.     {
  408.         FileName    = FilePart(FullName);
  409.         DrawerName    = PathPart(FullName);
  410.         Separator    = *DrawerName;
  411.         *DrawerName    = 0;
  412.     }
  413.  
  414.     if(FullName[0])
  415.         LimitedStrcpy(sizeof(LocalDrawerName),LocalDrawerName,FullName);
  416.     else
  417.     {
  418.         if(!LocalGetCurrentDirName(LocalDrawerName,sizeof(LocalDrawerName)))
  419.             LocalDrawerName[0] = 0;
  420.     }
  421.  
  422.     if(Separator)
  423.         *DrawerName = Separator;
  424.  
  425.     FileRequester = (struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  426.         ASLFR_Window,            Parent,
  427.         ASLFR_InitialDrawer,    LocalDrawerName,
  428.         ASLFR_InitialFile,        FileName,
  429.         ASLFR_Flags1,            Flags,
  430.     TAG_MORE,LocalTags);
  431.  
  432.     if(FileRequester)
  433.     {
  434.         BOOL GotIt = FALSE;
  435.  
  436.         LT_LockWindow(Parent);
  437.  
  438.         if(AslRequest(FileRequester,NULL))
  439.         {
  440.             PutDimensionTags(NULL,FileRequester->fr_LeftEdge,FileRequester->fr_TopEdge,FileRequester->fr_Width,FileRequester->fr_Height);
  441.  
  442.             if(strlen(FileRequester->fr_Drawer) < FullNameSize)
  443.             {
  444.                 STRPTR LocalFileName;
  445.  
  446.                 LimitedStrcpy(FullNameSize,FullName,FileRequester->fr_Drawer);
  447.  
  448.                 if(FileRequester->fr_NumArgs > 1 && FileRequester->fr_ArgList != NULL)
  449.                     LocalFileName = FileRequester->fr_ArgList->wa_Name;
  450.                 else
  451.                     LocalFileName = FileRequester->fr_File;
  452.  
  453.                 if(LocalFileName[0])
  454.                 {
  455.                     if(AddPart(FullName,LocalFileName,FullNameSize))
  456.                         GotIt = TRUE;
  457.                 }
  458.             }
  459.         }
  460.  
  461.         if(!GotIt)
  462.         {
  463.             FreeAslRequest(FileRequester);
  464.             FileRequester = NULL;
  465.         }
  466.  
  467.         LT_UnlockWindow(Parent);
  468.     }
  469.  
  470.     return(FileRequester);
  471. }
  472.  
  473. STATIC BOOL
  474. OpenFontCommon(struct Window *Parent,STRPTR FontName,WORD *FontSize,BOOL MonoSpaced)
  475. {
  476.     struct TagItem             DimensionTags[5];
  477.     struct FontRequester    *FontRequester;
  478.     BOOL                     Result = FALSE;
  479.  
  480.     if(FontRequester = (struct FontRequester *)AllocAslRequestTags(ASL_FontRequest,
  481.         ASLFO_Window,            Parent,
  482.         ASLFO_InitialName,        FontName,
  483.         ASLFO_InitialSize,        *FontSize,
  484.         ASLFO_InitialFrontPen,    Pens[TEXTPEN],
  485.         ASLFO_InitialBackPen,    Pens[BACKGROUNDPEN],
  486.         ASLFO_PrivateIDCMP,        TRUE,
  487.         ASLFO_MaxHeight,        255,
  488.         ASL_FuncFlags,            MonoSpaced ? (FONF_NEWIDCMP|FONF_FIXEDWIDTH) : FONF_NEWIDCMP,
  489.     TAG_MORE,GetDimensionTags(NULL,DimensionTags)))
  490.     {
  491.         LT_LockWindow(Parent);
  492.  
  493.         if(AslRequest(FontRequester,NULL))
  494.         {
  495.             PutDimensionTags(NULL,FontRequester->fo_LeftEdge,FontRequester->fo_TopEdge,FontRequester->fo_Width,FontRequester->fo_Height);
  496.  
  497.             strcpy(FontName,FontRequester->fo_Attr.ta_Name);
  498.  
  499.             *FontSize = FontRequester->fo_Attr.ta_YSize;
  500.  
  501.             Result = TRUE;
  502.         }
  503.  
  504.         LT_UnlockWindow(Parent);
  505.  
  506.         FreeAslRequest(FontRequester);
  507.     }
  508.  
  509.     return(Result);
  510. }
  511.  
  512. BOOL
  513. OpenAnyFont(struct Window *Parent,STRPTR FontName,WORD *FontSize)
  514. {
  515.     return(OpenFontCommon(Parent,FontName,FontSize,FALSE));
  516. }
  517.  
  518. BOOL
  519. OpenFixedFont(struct Window *Parent,STRPTR FontName,WORD *FontSize)
  520. {
  521.     return(OpenFontCommon(Parent,FontName,FontSize,TRUE));
  522. }
  523.